16
תגובות

ABORT LONG PULLING

פתח itamarhadad ,
יש לי קוד PHP שהוא לונג כלומר לא מפסיק אף פעם להיטען
הבעיה היא שאפילו שכשאני סוגר את הכרטיסייה או החלון הדף ממשיך לעבוד ברקע
ignore_user_abort(true);set_time_limit(0);$id=$_COOKIE['id'];
do{if(connection_status()!=CONNECTION_NORMAL)break;
sleep(3);
$t=time();
mysql_query("UPDATE users SET time=$t WHERE id=$id");
}while(true);

איך אני יכול לתת BREAK לדף כאשר הדף סגור

16 תשובות

avatar ענה OrelBeY ב 10 למאי 2013 #

אפילו בלי להבין את הקוד, על השורה הראשונה, בשפה פשוטה:

ignore_user_abort(true);

אין יותר מדי מה להבין (תקן אותי אם אני טועה) - אתה גרמת לזה בעצמך (לא להפסיק את ביצוע הסקריפט כשהלקוח סוגר את החלון).

avatar ענה PHPDeveloper ב 10 למאי 2013 #

הקוד הזה בכלל לא מומלץ

avatar ענה itamarhadad ב 10 למאי 2013 #

ניסיתי לתת עכשיו FALSE ועדיין הוא ממשיך לפעול ברקע..
אני חייב כל פעם לכבות את כל הWAMP כדי לגרום לדף להפסיק להיטען

ומה רע בקוד לא הבנתי..
מה עדיך לפתוח את הדף מחדש כל 3 שניות???

avatar ענה OrelBeY ב 10 למאי 2013 #

בוא נתחיל מהשאלה הבסיסית... מה אתה מנסה לעשות (כלומר: למה)?

avatar ענה itamarhadad ב 10 למאי 2013 #

כל משתמש שהוא בעצם "מחובר" אמור לעדכן את השרת ככה שבעצם מתי שהוא עוזב ,כלומר השרת מפסיק להתעדכן ממנו אז מובן מכך שהוא מנותק, הבעיה כאן שאפילו שהמשתמש סגר את החלון בו האתר היה פתוח הדף ממשיך לעבוד ולעדכן את ה"חיים" של המשתמש עם האיידי שלו

למה לא השתמשתי בJS כדי לוודא יציאה?
מיכיוון שלא בכל מקרה אהיה מודע ליציאת המשתמש ועכשיו גם אם יש הפסקת חשמל אני ידע שהמשתמש מנותק..

avatar ענה OrelBeY ב 10 למאי 2013 #

מה המטרה בעדכון הזה לשרת? מדובר במשחק או משהו כזה?

avatar ענה itamarhadad ב 10 למאי 2013 #

לא אחי זה כמו צאט רולט..
המטרה בעדכון זה להגיד שהמשתמש עידכן אות חיים פעם אחרונה בTIME() שהיה אז..

avatar ענה iiddaannyy ב 10 למאי 2013 #

זה לא יעבוד ככה. אתה חייב לשלוח פלט לפני שאתה מבצע את הבדיקה.
תעשה echo למשהו. תוכל גם לשלוח null byte:

echo chr(0);

תשים את השורה הזו לפני התנאי שלך ותגיד אם זה עבד.

avatar ענה itamarhadad ב 10 למאי 2013 #

המחשב לא ליידי עכשיו אבל מה זה קשור לפלט..
הדף ממשיך את הלולאה ולא נותן break בכלל
בגלל שהתנאי שם תקין ועדיין מחזיר true..

צריך תנאי שיחזיר לי false..

avatar ענה itamarhadad ב 11 למאי 2013 #

אז ככה:
ניסיתי:

<?php ignore_user_abort(true);set_time_limit(0);$id=$_COOKIE['id'];
do{echo chr(0);if(connection_status()!=CONNECTION_NORMAL)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>

לא עבד

ניסיתי:
<?php ignore_user_abort(true);set_time_limit(0);$id=$_COOKIE['id'];
do{echo chr(0);if(connection_status()!=0)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>

לא עבד

ניסיתי:
<?php ignore_user_abort(false);set_time_limit(0);$id=$_COOKIE['id'];
do{echo chr(0);if(connection_status()!=0)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>

לא עבד

ניסיתי:
<?php ignore_user_abort(false);set_time_limit(0);$id=$_COOKIE['id'];
do{echo chr(0);if(connection_status()!=CONNECTION_NORMAL)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>

לא עבד


מישהו יודע מה עוד אפשר לנסות??

avatar ענה dekelyi ב 12 למאי 2013 #

1) אולי פשוט תמחק את הקריאה ל ignore_user_abort מהדף?
2) הברירת מחדל של set_time_limit היא 0, וחוץ מזה - הברירת מחדל של max_execution_time היא 30 שניות - אני בטוח שהסקריפט שלך לא מגיע לכמות כזאת של זמן עבור בקשה קטנה.
3) למה לולאת do..while אם הלולאה אין סופית.. עדיף לולאת while רגילה.
5) אתה מבין שהלולאה האין סופית הזאת גורמת לדף להיתקע?
6) זה שיטה מאוד לא יעילה.. ניסית אולי להשתמש בSSE או ווב-סוקטים?
בכללי, עם ווב-סוקטים, כל העניין הזה של צ'אט הופך להיות מאוד קל כשאתה צריך רק קובץ אחד (או שניים מקסימום) לכל הצ'אט.

avatar ענה itamarhadad ב 12 למאי 2013 #

ניסיתי הכל כבר לא מצאתי שום דרך אם משהו יכול עזור אז תודה
סיימתי הכל כבר ורק החלק הזה תוקע אותי מלהוציא את האתר החוצה

avatar ענה itamarhadad ב 12 למאי 2013 #

קודם כל הברירת מחדל של set_time_limit בWAMP היא 60 שניות זה דבר ראשון לכן אני חייב להגדיר את זה כ-0
והשתמשתי בDO WHILE מיכיוון שרק בDO WHILE ניתן להריץ את הפעם הראשונה מבלי לעבור על התנאי וזה מה שחיפשתי

מבחינת עבודה זה אותו דבר
http://php.net/manual/en/control-structures.do.while.php

avatar ענה iiddaannyy ב 12 למאי 2013 #

התנאי שאתה מדלג עליו באיטרציה הראשונה הוא true תמיד....

avatar ענה itamarhadad ב 12 למאי 2013 #

סליחה במקרה הזה זה טיפשי
אבל בשאר הדפים זה נחוץ..

do{
sleep(3);
$re=mysql_fetch_row(mysql_query("SELECT `p` FROM hosts WHERE id='$id' LIMIT 1"));}
while($re[0]==0);